{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-27T03:30:58.267425Z",
     "start_time": "2025-06-27T03:30:58.264588Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['D:\\\\BaiduSyncdisk\\\\pytorch', 'C:\\\\Program Files\\\\Python312\\\\python312.zip', 'C:\\\\Program Files\\\\Python312\\\\DLLs', 'C:\\\\Program Files\\\\Python312\\\\Lib', 'C:\\\\Program Files\\\\Python312', '', 'C:\\\\Users\\\\41507\\\\AppData\\\\Roaming\\\\Python\\\\Python312\\\\site-packages', 'C:\\\\Users\\\\41507\\\\AppData\\\\Roaming\\\\Python\\\\Python312\\\\site-packages\\\\win32', 'C:\\\\Users\\\\41507\\\\AppData\\\\Roaming\\\\Python\\\\Python312\\\\site-packages\\\\win32\\\\lib', 'C:\\\\Users\\\\41507\\\\AppData\\\\Roaming\\\\Python\\\\Python312\\\\site-packages\\\\Pythonwin', 'C:\\\\Program Files\\\\Python312\\\\Lib\\\\site-packages']\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "print(sys.path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-27T03:31:00.242376Z",
     "start_time": "2025-06-27T03:30:58.267425Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.datasets import fetch_california_housing\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "from tqdm.auto import tqdm\n",
    "from torch.utils.data import DataLoader, Dataset\n",
    "from deeplearning_func import EarlyStopping, ModelSaver\n",
    "from deeplearning_func import plot_learning_loss_curves,train_regression_model,evaluate_regression_model\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-27T03:31:00.259272Z",
     "start_time": "2025-06-27T03:31:00.242376Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集大小: 13209\n",
      "验证集大小: 3303\n",
      "测试集大小: 4128\n"
     ]
    }
   ],
   "source": [
    "\n",
    "\n",
    "# 加载加利福尼亚房价数据集\n",
    "housing = fetch_california_housing()\n",
    "X = housing.data\n",
    "y = housing.target\n",
    "\n",
    "# 数据拆分：训练集(60%)、验证集(20%)、测试集(20%)\n",
    "X_train_val, X_test, y_train_val, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "X_train, X_val, y_train, y_val = train_test_split(X_train_val, y_train_val, test_size=0.2, random_state=42)  # 0.25 x 0.8 = 0.2\n",
    "\n",
    "print(f\"训练集大小: {X_train.shape[0]}\")\n",
    "print(f\"验证集大小: {X_val.shape[0]}\")\n",
    "print(f\"测试集大小: {X_test.shape[0]}\")\n",
    "\n",
    "# 数据标准化\n",
    "scaler = StandardScaler()\n",
    "X_train_scaled = scaler.fit_transform(X_train)\n",
    "X_val_scaled = scaler.transform(X_val)\n",
    "X_test_scaled = scaler.transform(X_test)\n",
    "\n",
    "# 自定义数据集类\n",
    "class HousingDataset(Dataset):\n",
    "    def __init__(self, features, targets):\n",
    "        self.features = torch.FloatTensor(features)\n",
    "        self.targets = torch.FloatTensor(targets).view(-1, 1)\n",
    "        \n",
    "    def __len__(self):\n",
    "        return len(self.features) #返回样本数量\n",
    "    \n",
    "    def __getitem__(self, idx): #传入索引，返回对应索引样本的特征和目标\n",
    "        return (self.features[idx],self.features[idx][-2:]), self.targets[idx]\n",
    "\n",
    "# 创建数据集实例\n",
    "train_dataset = HousingDataset(X_train_scaled, y_train)\n",
    "val_dataset = HousingDataset(X_val_scaled, y_val)\n",
    "test_dataset = HousingDataset(X_test_scaled, y_test)\n",
    "\n",
    "# 创建数据加载器\n",
    "train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)\n",
    "val_loader = DataLoader(val_dataset, batch_size=32)\n",
    "test_loader = DataLoader(test_dataset, batch_size=32)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-27T03:31:00.266265Z",
     "start_time": "2025-06-27T03:31:00.259272Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'list'>\n",
      "[tensor([[-1.0452e+00, -6.0110e-01, -7.9562e-01, -3.0628e-02,  3.0260e+00,\n",
      "         -1.0644e-01, -1.3342e+00,  1.3182e+00],\n",
      "        [ 7.6063e-01, -1.0777e+00,  4.7343e-01, -2.6737e-01,  1.4361e+00,\n",
      "         -2.0799e-02,  1.4121e+00, -1.1005e+00],\n",
      "        [-1.1623e+00,  3.5211e-01, -6.2505e-01, -4.1986e-01, -8.6259e-01,\n",
      "         -1.1328e-01,  1.0044e+00, -8.1124e-01],\n",
      "        [-7.4226e-01, -1.0777e+00,  2.0403e-01,  8.7374e-02,  8.4955e-01,\n",
      "          4.7651e-02, -8.5148e-01,  1.1437e+00],\n",
      "        [-9.5587e-01,  1.2259e+00, -6.4390e-01,  1.7071e-02, -3.1738e-01,\n",
      "         -6.3348e-03,  6.3885e-01, -9.9078e-01],\n",
      "        [ 1.7958e-01,  2.7268e-01,  7.2919e-01,  4.7638e-01, -1.1282e+00,\n",
      "         -7.9712e-02,  9.9503e-01, -1.0107e+00],\n",
      "        [-8.1258e-01, -2.8336e-01,  2.0046e-01, -2.7461e-02, -1.4942e-01,\n",
      "         -4.7565e-02,  5.4043e-01, -8.3133e-02],\n",
      "        [ 1.6735e-01,  1.2259e+00, -2.0254e-01, -2.4756e-01, -8.1775e-01,\n",
      "         -1.2388e-01, -7.9055e-01,  5.9012e-01],\n",
      "        [-1.4828e+00,  1.9324e-01,  3.4867e+00,  5.6710e+00, -1.1563e+00,\n",
      "         -9.4261e-02,  2.7431e+00, -1.0855e+00],\n",
      "        [ 1.8534e+00, -9.1884e-01, -1.9552e-01, -2.6356e-01, -1.0534e+00,\n",
      "         -2.3812e-01, -7.0151e-01,  7.0981e-01],\n",
      "        [ 3.5197e-01,  1.2259e+00,  1.5422e-02,  1.0422e-01,  5.6353e-02,\n",
      "          1.4113e-01,  9.6222e-01, -1.4396e+00],\n",
      "        [ 1.0262e+00, -1.4749e+00,  1.2913e-01,  4.4767e-01, -6.3484e-01,\n",
      "         -5.8155e-02, -7.7180e-01,  5.9012e-01],\n",
      "        [-6.9331e-01,  6.6985e-01, -3.2165e-01, -6.3695e-02,  2.4696e-02,\n",
      "          8.7095e-03,  1.1591e+00, -8.4117e-01],\n",
      "        [-4.2223e-01, -1.6337e+00, -3.8892e-01, -2.4013e-02,  7.3431e-05,\n",
      "         -5.6406e-02, -4.7186e-01, -4.4220e-01],\n",
      "        [ 7.7349e-01, -2.8336e-01, -1.4160e-01, -3.5691e-01, -4.7391e-01,\n",
      "          1.5772e-01, -8.4679e-01,  6.7490e-01],\n",
      "        [-3.6476e-02,  1.9324e-01, -2.9668e-01, -3.3619e-01,  7.0423e-02,\n",
      "         -2.9461e-02,  1.2200e+00, -1.5244e+00],\n",
      "        [-1.0304e-01, -1.5543e+00,  2.0571e-01, -1.9518e-01, -1.7580e-01,\n",
      "         -8.4619e-02,  7.9351e-01, -4.4220e-01],\n",
      "        [-6.2986e-01,  1.3053e+00, -9.1417e-01,  3.3090e-02, -7.6432e-02,\n",
      "         -1.7035e-01, -8.7960e-01,  7.0482e-01],\n",
      "        [ 6.0517e-02,  5.1098e-01, -1.3240e-01, -1.7416e-01,  4.4240e-01,\n",
      "         -4.8138e-02,  8.9192e-01, -1.3548e+00],\n",
      "        [ 1.3362e+00, -1.9515e+00,  1.2311e-01,  3.7742e-03,  3.6811e+00,\n",
      "         -1.2438e-01,  9.9971e-01, -1.1803e+00],\n",
      "        [-1.0455e+00,  1.2259e+00, -3.0100e-01, -2.6099e-01, -7.2035e-02,\n",
      "          5.9849e-02, -6.8745e-01,  7.0981e-01],\n",
      "        [-8.3020e-01,  1.1381e-01, -8.3551e-01, -1.8195e-01, -1.1106e+00,\n",
      "          1.5610e-01,  3.1548e-01, -8.3618e-01],\n",
      "        [-1.3477e+00,  1.1381e-01, -1.7402e-02,  5.5002e-02,  7.1084e-03,\n",
      "          5.0601e-02,  5.4512e-01, -1.4796e-01],\n",
      "        [ 6.9243e-01,  5.1098e-01,  2.1495e-01, -2.3276e-01,  8.1525e-01,\n",
      "          4.2391e-02, -8.4679e-01,  7.8462e-01],\n",
      "        [-4.2826e-02,  5.1098e-01,  1.3857e-01, -2.7146e-01, -1.0105e-01,\n",
      "         -9.3266e-02,  1.3840e+00, -8.9104e-01],\n",
      "        [-1.6170e+00, -1.6337e+00, -1.0883e+00,  4.3417e-01, -2.9979e-01,\n",
      "         -2.8290e-01, -7.4837e-01,  6.6493e-01],\n",
      "        [-7.1019e-01,  1.2259e+00, -7.4294e-01, -2.2151e-01,  2.5597e-01,\n",
      "          1.7987e-01, -7.5774e-01,  6.8487e-01],\n",
      "        [ 5.9850e-01,  1.1465e+00, -5.0625e-02, -3.4034e-01, -3.1298e-01,\n",
      "         -4.7373e-02, -8.3742e-01,  7.1978e-01],\n",
      "        [-8.4057e-01,  1.0670e+00, -7.5150e-01,  8.1278e-02, -1.7580e-01,\n",
      "         -2.1432e-03, -1.3717e+00,  1.2185e+00],\n",
      "        [ 5.7840e-01, -2.0309e+00,  5.8666e-01,  9.0733e-02,  1.5926e+00,\n",
      "          5.7965e-03,  1.2340e+00, -1.2052e+00],\n",
      "        [-7.0548e-01,  3.5211e-01,  7.7728e-02,  1.6190e-01, -4.8182e-01,\n",
      "          1.2770e-02, -7.7180e-01,  1.2584e+00],\n",
      "        [-1.1600e+00,  1.1381e-01, -6.2883e-01, -3.3304e-01, -5.6976e-01,\n",
      "         -7.1736e-02,  1.1263e+00, -1.3299e+00]]), tensor([[-1.3342,  1.3182],\n",
      "        [ 1.4121, -1.1005],\n",
      "        [ 1.0044, -0.8112],\n",
      "        [-0.8515,  1.1437],\n",
      "        [ 0.6388, -0.9908],\n",
      "        [ 0.9950, -1.0107],\n",
      "        [ 0.5404, -0.0831],\n",
      "        [-0.7906,  0.5901],\n",
      "        [ 2.7431, -1.0855],\n",
      "        [-0.7015,  0.7098],\n",
      "        [ 0.9622, -1.4396],\n",
      "        [-0.7718,  0.5901],\n",
      "        [ 1.1591, -0.8412],\n",
      "        [-0.4719, -0.4422],\n",
      "        [-0.8468,  0.6749],\n",
      "        [ 1.2200, -1.5244],\n",
      "        [ 0.7935, -0.4422],\n",
      "        [-0.8796,  0.7048],\n",
      "        [ 0.8919, -1.3548],\n",
      "        [ 0.9997, -1.1803],\n",
      "        [-0.6874,  0.7098],\n",
      "        [ 0.3155, -0.8362],\n",
      "        [ 0.5451, -0.1480],\n",
      "        [-0.8468,  0.7846],\n",
      "        [ 1.3840, -0.8910],\n",
      "        [-0.7484,  0.6649],\n",
      "        [-0.7577,  0.6849],\n",
      "        [-0.8374,  0.7198],\n",
      "        [-1.3717,  1.2185],\n",
      "        [ 1.2340, -1.2052],\n",
      "        [-0.7718,  1.2584],\n",
      "        [ 1.1263, -1.3299]])]\n"
     ]
    }
   ],
   "source": [
    "for i,j in train_loader:\n",
    "    print(type(i))\n",
    "    print(i)\n",
    "    break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 加载数据，构建模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-27T03:31:00.949322Z",
     "start_time": "2025-06-27T03:31:00.267268Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WideDeepModel(\n",
      "  (deep): Sequential(\n",
      "    (0): Linear(in_features=2, out_features=30, bias=True)\n",
      "    (1): ReLU()\n",
      "    (2): Linear(in_features=30, out_features=30, bias=True)\n",
      "    (3): ReLU()\n",
      "  )\n",
      "  (output): Linear(in_features=38, out_features=1, bias=True)\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "from torch import optim\n",
    "\n",
    "\n",
    "\n",
    "# 定义神经网络模型\n",
    "class WideDeepModel(nn.Module):\n",
    "    def __init__(self, input_dim=(8,2)):\n",
    "        super().__init__()\n",
    "        # Deep部分使用Sequential\n",
    "        self.deep = nn.Sequential(\n",
    "            nn.Linear(input_dim[1], 30),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(30, 30),\n",
    "            nn.ReLU()\n",
    "        )\n",
    "        \n",
    "        # Wide部分直接使用原始输入\n",
    "        \n",
    "        # 输出层，输入维度是deep部分的30 + wide部分的input_dim\n",
    "        self.output = nn.Linear(30 + input_dim[0], 1)\n",
    "        \n",
    "    def forward(self, x_wide, x_deep):\n",
    "        # Deep路径，deep shape是[batch_size, 30]\n",
    "        deep = self.deep(x_deep)\n",
    "        \n",
    "        # Wide路径直接使用原始输入\n",
    "        wide = x_wide\n",
    "        \n",
    "        # 连接Wide和Deep,combined shape是[batch_size, 30 + input_dim[0]]\n",
    "        combined = torch.cat([wide, deep], dim=1)\n",
    "        \n",
    "        # 输出层，输出shape是[batch_size, 1]\n",
    "        output = self.output(combined)\n",
    "        return output\n",
    "\n",
    "# 初始化模型、损失函数和优化器\n",
    "model = WideDeepModel()\n",
    "criterion = nn.MSELoss()\n",
    "optimizer = optim.Adam(model.parameters())\n",
    "\n",
    "# 打印模型结构\n",
    "print(model)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-27T03:32:15.045032Z",
     "start_time": "2025-06-27T03:31:00.949322Z"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "7a7a2849401b4438bbfaee0f51c87994",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "train progress:   0%|          | 0/41300 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "\n",
    "\n",
    "# 训练模型\n",
    "# 初始化早停和模型保存对象\n",
    "early_stopping = EarlyStopping(patience=10, verbose=True)\n",
    "model_saver = ModelSaver(save_dir='model_weights')\n",
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "model, record_dict = train_regression_model(\n",
    "    model=model,\n",
    "    train_loader=train_loader,\n",
    "    val_loader=val_loader,\n",
    "    criterion=criterion,\n",
    "    optimizer=optimizer,\n",
    "    num_epochs=100,\n",
    "    print_every=10,\n",
    "    eval_step=500,\n",
    "    early_stopping=early_stopping,\n",
    "    model_saver=model_saver,\n",
    "    device=device\n",
    ")\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-27T03:32:15.208520Z",
     "start_time": "2025-06-27T03:32:15.046032Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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5JJLpEaNGmbNny5dusjkyZMLLIdzOBzy0UcfyY033mj+ja6789NPPxV7TL/77jtp3bq12Sb9Xa+88kqu77/zzjvmd2hba93OK6+80ve9b7/9Vtq2bWtaYFepUkX69u0rx44dEyuRCQqQvYkZsjfNIYeOZYZ6UwAAAFCANGe2tBr+R9B/7+qnB0hcVOEOvzX4Wb9+vbRp00aefvppc9+qVavM9aOPPir//e9/pXHjxlKpUiXZsWOHnH/++fLcc8+ZIOTTTz+Viy66SNatWyf169c/4e945pln5KmnnpJXX31V3n77bbnhhhvMGjyVK1cu0vNasmSJXH311TJixAi55pprZO7cuXLPPfeYgEaDucWLF8t9990nn332mXTv3l0OHz4ss2bNMv92z549ct1118lLL70kl112mSQnJ5vvFSVgLA6CoACJinCvPJyZnRPqTQEAAEAJV6FCBYmKijILvNasWdPct3btWnOtQVG/fv18j9WgpV27drmCmwkTJpjMzpAhQ074OwYOHGgyMgkJCfL888/LG2+8IQsXLpRzzz23SNuqQVSfPn3kySefNF83b95cVq9eLS+//LIJgrZv327mI1144YUSHx8vDRo0kA4dOviCoKysLLn88svN/UqzQlYjCAqQqAh3ZWFmlrVRKwAAAE5NbGS4ycqE4vcGQufOnXN9nZKSYrIwv/76qy+oSEtLM8FHQdr6BRsapGgwtH///iJvz5o1a0w5nr8ePXqY8juds6QBmwY4mrnSAEsvmvXRAE+DNw2gdFsGDBgg/fv3N4GZZrisxJygAIkK9wZBZIIAAADsTOfDaFlasC/6ewMhb5e3hx56yGR+NJujpWR//fWXCSoyMwuephEZGXncuOTkBP5YVrM/S5culS+//FJq1aolw4cPN8GPttgODw+XSZMmmXlOrVq1kjfffFNatGghW7ZsESsRBAVIpDcIohwOAAAAAaDlcJpJOZk5c+aYsjPNrmjwo+VzW7dulWBp2bKl2Ya826RlcRrkKO1gpw0PdO7PihUrzPZNnTrVF3xp5mjkyJGybNky87w1qLMS5XABL4cjCAIAAMCp0y5rCxYsMAGDdnA7UZZGu659//33phmCBhQ6N8eKjM6JPPjgg6Yjnc5F0sYI8+bNk7feest0hFO//PKLbN68WXr27GnK3H777TezfZrx0ec3ZcoUUwZX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JiWJotGyIT3To2d9vBjTU6OlWvrm5r/vJiUlmS5x/vuu0jkt2rFHx7yoZzohsnPnTjMnyH//VYxr7vl9eqCupS+aGdP905++z0ZGRubaX7UMRucK5t1fdUz17LGeIS6NH9SBHNf8eNevyru/Mq4F089+LW1lX7VmXPPDvlo4Og5aZqjj5b107tzZzLf23o5kn6U7XHF89dVXpqPW2LFjXatXr3bdeeedrooVK7r27t17XPco7bwRExOTqwMHjvfggw+6pk+fbrpozZkzx9W3b19X1apVTWcjxZgWvhOMdiDTi47Zq6++am57O5C98MILZl/98ccfXStWrDAdzRo1auRKS0vLt4vZa6+95ipfvrxr1qxZrrKsoHHV7z300EOmo46O3+TJk10dO3Y0HXnS09PNv2dcj3f33Xe7KlSoYP7u9+zZ47ukpqb6HnPXXXe56tev75o6dapr8eLFrm7dupmLV97uRffff7+rRo0apstRWXWycd24caPr6aefNuOp+6W+FzRu3NjVs2dP389gXI/36KOPmg57Omb63qlfOxwO159//mm+z74a+HFlXw2svJ327mKfdREEFdObb75pdp6oqCjTMnv+/PknbKE7fvx4c9D+3XffhWhr7e+aa65x1apVy4xnnTp1zNf6BujFmBaO900r70VbOHvbZD/55JPmjUwD+T59+rjWrVvn+/d5D9bVK6+84oqPjzfBaVlV0LjqwWX//v1d1apVMy1HGzRo4Bo0aJDvpIhiXI+X33jqZcyYMb7HaHB+zz33mJa5cXFxrssuu8wc0J/oQ1rde++95r3Ef78uS042rtu3bzcHkZUrVzbvAU2bNnU9/PDDrsTERN/PYFyPd9ttt5m/bf2M0r91fe/0BkCKfTXw48q+am0QlMY+63Lo/0KdjQIAAACAYGFOEAAAAIAyhSAIAAAAQJlCEAQAAACgTCEIAgAAAFCmEAQBAAAAKFMIggAAAACUKQRBAAAAAMoUgiAAAAAAZQpBEAAAAIAyhSAIAFAi3HLLLXLppZeGejMAAKUAQRAAAACAMoUgCABgK99++620bdtWYmNjpUqVKtK3b195+OGH5ZNPPpEff/xRHA6HuUyfPt08fseOHXL11VdLxYoVpXLlynLJJZfI1q1bj8sgjRw5UqpVqyYJCQly1113SWZmZgifJQAglCJC+tsBAPCzZ88eue666+Sll16Syy67TJKTk2XWrFly8803y/bt2yUpKUnGjBljHqsBj9PplAEDBki3bt3M4yIiIuTZZ5+Vc889V1asWCFRUVHmsVOmTJGYmBgTOGmAdOutt5oA67nnngvxMwYAhAJBEADAVkFQVlaWXH755dKgQQNzn2aFlGaGMjIypGbNmr7Hf/7555KTkyMfffSRyQ4pDZI0K6QBT//+/c19Ggx9/PHHEhcXJ61bt5ann37aZJeeeeYZCQujKAIAyhre+QEAttGuXTvp06ePCXyuuuoq+fDDD+XIkSMnfPzy5ctl48aNEh8fL+XLlzcXzRClp6fLpk2bcv1cDYC8NHOUkpJiSukAAGUPmSAAgG2Eh4fLpEmTZO7cufLnn3/Km2++KU888YQsWLAg38drINOpUyf54osvjvuezv8BACA/BEEAAFvRsrYePXqYy/Dhw01Z3IQJE0xJW3Z2dq7HduzYUcaPHy/Vq1c3DQ8KyhilpaWZkjo1f/58kzWqV6+e5c8HAGA/lMMBAGxDMz7PP/+8LF682DRC+P777+XAgQPSsmVLadiwoWl2sG7dOjl48KBpinDDDTdI1apVTUc4bYywZcsWMxfovvvuk507d/p+rnaCu/3222X16tXy22+/yVNPPSVDhgxhPhAAlFFkggAAtqHZnJkzZ8ro0aNNJzjNAr3yyity3nnnSefOnU2Ao9daBjdt2jTp3bu3efwjjzximiloN7k6deqYeUX+mSH9ulmzZtKzZ0/TXEE70I0YMSKkzxUAEDoOl8vlCuHvBwDAUrpO0NGjR+WHH34I9aYAAGyCOgAAAAAAZQpBEAAAAIAyhXI4AAAAAGUKmSAAAAAAZQpBEAAAAIAyhSAIAAAAQJlCEAQAAACgTCEIAgAAAFCmEAQBAAAAKFMIggAAAACUKQRBAAAAAKQs+X++A14IaEdDhQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1000x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#画图\n",
    "plot_learning_loss_curves(record_dict,sample_step=500)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-27T03:32:15.309244Z",
     "start_time": "2025-06-27T03:32:15.209732Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试集上的损失为0.3862\n"
     ]
    }
   ],
   "source": [
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "test_loss=evaluate_regression_model(model,test_loader,device,criterion)\n",
    "print(f\"测试集上的损失为{test_loss:.4f}\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
